#include <memory>
#include <vector>
#include <iostream>

// 自定义内存分配器
template<typename T>
class MemoryPoolAllocator {
public:
    using value_type = T;

    // 分配内存块: 分配n个T类型的对象所需的内存
    T* allocate(std::size_t n) {
        std::cout << "Allocating " << n << " objects of size " << sizeof(T) << std::endl;
        return static_cast<T*>(::operator new(n * sizeof(T)));  // 使用全局new运算符分配足够的原始内存
    }

    // 释放内存块: 释放先前分配的内存
    void deallocate(T* p, std::size_t n) {
        std::cout << "Deallocating " << n << " objects of size " << sizeof(T) << std::endl;
        ::operator delete(p);  // 使用全局delete运算符释放内存
    }

    // 构造对象: 在已分配的内存上构造对象
    template<typename U, typename... Args>
    void construct(U* p, Args&&... args) {
        new (p) U(std::forward<Args>(args)...);  // 使用定位new表达式在原始内存上构造对象
    }

    // 析构对象: 调用对象的析构函数
    template<typename U>
    void destroy(U* p) {
        p->~U();  // 显式调用析构函数
    }
};

// 使用自定义内存池分配器的std::vector示例
int main() {
    std::vector<int, MemoryPoolAllocator<int>> myVector;

    // 向vector中添加元素，这将触发MemoryPoolAllocator的构造函数和分配器逻辑
    myVector.push_back(10);
    myVector.push_back(20);
}